package tp.tecnicasdisenio.model.accion;

import java.util.ArrayList;
import java.util.Iterator;

import tp.tecnicasdisenio.dao.AlumnoDaoInterface;
import tp.tecnicasdisenio.dao.ConsultaDaoInterface;
import tp.tecnicasdisenio.dao.MateriaDaoInterface;
import tp.tecnicasdisenio.dao.TicketDaoInterface;
import tp.tecnicasdisenio.model.AccionInterface;
import tp.tecnicasdisenio.model.AutoRespondedorInterface;
import tp.tecnicasdisenio.model.MailInterface;
import tp.tecnicasdisenio.model.entity.Alumno;
import tp.tecnicasdisenio.model.entity.Consulta;
import tp.tecnicasdisenio.model.entity.ConsultaEstado;
import tp.tecnicasdisenio.model.entity.Materia;
import tp.tecnicasdisenio.model.entity.Ticket;
import tp.tecnicasdisenio.model.parser.ParserTituloConsultaTemaAbstract;

public class AccionCrearTicket implements AccionInterface{
	private ConsultaDaoInterface consultaDao;
	private TicketDaoInterface ticketDao;
	private AlumnoDaoInterface alumnoDao;
	private MateriaDaoInterface materiaDao;
	private Ticket ticket;
	private ParserTituloConsultaTemaAbstract parserTitulo;
	
	public AccionCrearTicket(){
		this.ticket = new Ticket();
	}
	
	public Ticket getTicket(){
		return this.ticket;
	}
	
	public void setTicketDao(TicketDaoInterface ticketDao){
		this.ticketDao = ticketDao;
	}
	
	public void setConsultaDao(ConsultaDaoInterface consultaDao){
		this.consultaDao = consultaDao;
	}
	
	public void setAlumnoDao(AlumnoDaoInterface alumnoDao){
		this.alumnoDao  = alumnoDao;
	}
	
	public void setMateriaDao(MateriaDaoInterface materiaDao){
		this.materiaDao = materiaDao;
	}
	
	public void setParser(ParserTituloConsultaTemaAbstract parser){
		this.parserTitulo  = parser;
	}
	
	public boolean construirTicket(MailInterface mail){
		String padron = this.obtenerPadron(mail);
		if (padron != null){
			this.ticket.setPadron(padron);
		}else{
			//chequeo que si no es un alumno, que el email pertenezca a un docente de la materia
			if (this.existeDocente(mail)){
				System.out.println("existe el docente");
				this.ticket.setPadron("0");
			}else{
				this.ticket = null;
				return false;
			}
		}
		
		this.ticket.setTema(this.extraerTema(mail));
		this.ticket.setMimeId(mail.getMensaje().getId());
		this.ticket.setFecha(mail.getFecha());
		
		return true;
	}
	
	private boolean existeDocente(MailInterface mail){
		Materia materia = this.materiaDao.getPorEmail(mail.getTo().get(0));
		ArrayList<String> emailsDocentes = this.materiaDao.getEmailsDocentes(materia.getId());
		
		Iterator<String> emailsDocentesIt = emailsDocentes.iterator();
		while (emailsDocentesIt.hasNext()){
			if (emailsDocentesIt.next().trim().equals(mail.getFrom().trim())){
				return true;
			}
		}
		
		return false;
	}
	
	public void insertarTicket(){
		this.ticketDao.insertar(ticket);
	}
	
	private String obtenerPadron(MailInterface mail){
		Alumno alumno = this.alumnoDao.getPorEmail(mail.getFrom());
		if (alumno != null)
			return alumno.getPadron();
		else
			return null;
	}
	
	private String extraerTema(MailInterface mail){
		this.parserTitulo.setMail(mail);
		return this.parserTitulo.getTema();
	}

	@Override
	public void aplicarSobre(MailInterface mail, AutoRespondedorInterface autoRespondedor) {
		if (this.consultaAbierta(mail)){
			System.out.println("la consulta esta abierta");
			if (this.construirTicket(mail)){
				System.out.println("se construyo el ticket");
				this.insertarTicket();
				
				this.actualizarEstadoConsulta(mail);
			}
		}else{
			autoRespondedor.responderA(mail, "La consulta se ha cerrado, por favor crea otra.");
		}
	}

	private boolean consultaAbierta(MailInterface mail) {
		Consulta consulta = this.consultaDao.getPorId(this.extraerTema(mail));
		if (consulta == null){
			System.out.println("la consulta no existe:" + this.extraerTema(mail));
			return false;
		}else{
			System.out.println("chequeo estado de la consulta: " + consulta.getTema());
			return (!consulta.getEstado().equals(ConsultaEstado.CERRADO));
		}
	}

	private void actualizarEstadoConsulta(MailInterface mail) {
		Consulta consulta = this.consultaDao.getPorId(this.extraerTema(mail));
		if (this.ticket.getPadron() == "0"){
			//el ticket es una respuesta de un docente de la materia 
			//entonces le paso el estado a ASIGNADO
			consulta.setEstado(ConsultaEstado.ASIGNADO);
			System.out.println("se actualizo la consulta a asignado");
		}else{
			//el ticket es una respuesta de un alumno de la materia 
			//entonces le paso el estado a PENDIENTE
			consulta.setEstado(ConsultaEstado.PENDIENTE);
			System.out.println("se actualizo la consulta a pendiente");
		}
		this.consultaDao.actualizar(consulta);
	}
}
